﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.IO;
using System.Reflection;
using Operacion;

namespace CalculadoraSimple
{    

    public partial class Form1 : Form
    {
        private Operacion.Operacion [] ArregloPlugins;
        private int n1;
        private int n2;
        private Operacion.Operacion plug;


        public Form1()
        {
            InitializeComponent();
            ArregloPlugins = new Operacion.Operacion [100];


        }

        private void BotonActualizar_Click(object sender, EventArgs e)
        {
            Numero1.Text = "";
            Numero2.Text = "";
            Operaciones.Text = "Operación";
            Resultado.Text = "";
            Operaciones.Items.Clear();

            string path = AppDomain.CurrentDomain.BaseDirectory + "Plugins";

            //Contador de plugins, que sera utilizado como indice en el arreglo. 
            int i = 0; 

            //Go through all the files in the plugin directory
            foreach (string archivo in Directory.GetFiles(path))
            {
                FileInfo file = new FileInfo(archivo);

                //Preliminary check, must be .dll
                if (file.Extension.Equals(".dll"))
                {
                    //Creamos el ensamblado de cada plugin.
                    Assembly ensamblado = Assembly.LoadFrom(archivo);

                    // Cargar los tipos que contiene el ensamblado 
                    Type[] tipos = ensamblado.GetTypes();
                    // Examinar cada uno de los tipos 
                    foreach (Type tipo in tipos)
                    {
                        // Si el tipo es una clase, instanciar un objeto 
                        if (tipo.IsClass)
                        {
                            // Crear una instancia de la clase 
                            Object plugin = Activator.CreateInstance(tipo);
                            Operacion.Operacion plug = (Operacion.Operacion)plugin;
                            

                            MethodInfo metodoSimbolo = tipo.GetMethod("GetSimbolo");

                            if (metodoSimbolo != null)
                            {
                                string simb = (string)metodoSimbolo.Invoke(plugin, null);
                                Operaciones.Items.Add(simb);

                                ArregloPlugins.SetValue(plug, i);
                                i++;

                            }
                                
                            
                        }
                    }
                }
            }

        }

        private void Operaciones_SelectedIndexChanged(object sender, EventArgs e)
        {
            int index = Operaciones.SelectedIndex;
            plug = ArregloPlugins[index];
        }

        private void BotonCalcular_Click(object sender, EventArgs e)
        {
            n1 = Convert.ToInt16(Numero1.Text);
            n2 = Convert.ToInt16(Numero2.Text);
            float res = plug.Calcular(n1, n2);
            Resultado.Text = "" + res;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}
